iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
Software Development

持續進化論系列 第 7

DAY07 - 站在巨人的肩膀

  • 分享至 

  • xImage
  •  

從最早期的MySQL Extension,到後來的 MySQLi Extension,再來是更進階的 PDO ,從以前每一個連線都需要自己寫,要防範外部傳進來的資料造成 SQL Injection,每個時期的進步也都解決了前一個時期的問題,現今的框架已經把這些問題都解決了。

Laravel 的 Model 層負責處理 AP 層與資料庫之間的溝通,並且將關聯、特殊處理、隱藏特殊資料等功能都已經寫好,只需要設定即可使用,搭配 Migration 的功能可以將資料庫的 Table、Column 設定文件化,更容易了解整個專案的來龍去脈,以下就以實例的方式來講解幾個常見關聯及 Model、Migration 的使用方式。

假設這次有三個實體,使用者(User)紀錄姓名、性別,評論(Post)紀錄撰寫者、標題、內容、最佳留言,留言(Comment)紀錄留言在哪篇文章、留言者、內容,先將這三個實體利用指令建立起來。

php artisan make:model User -m
php artisan make:model Post -m
php artisan make:model Comment -m
-m 參數代表連同 migration 一起創建

User migration

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->integer('gender');
        $table->timestamps();
    });
}

Post migration

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->unsignedInteger('writer_id');
        $table->foreign('writer_id')
            ->references('id')
            ->on('users')
            ->onUpdate('CASCADE')
            ->onDelete('CASCADE');
        $table->string('title');
        $table->text('content');
        $table->unsignedInteger('best_comment_id')->nullable();
        $table->foreign('best_comment_id')
            ->references('id')
            ->on('comments')
            ->onUpdate('CASCADE')
            ->onDelete('CASCADE');
        $table->timestamps();
    });
}

Comment migration

public function up()
{
    Schema::create('comments', function (Blueprint $table) {
        $table->id();
        $table->unsignedInteger('post_id');
        $table->foreign('post_id')
            ->references('id')
            ->on('posts')
            ->onUpdate('CASCADE')
            ->onDelete('CASCADE');
        $table->unsignedInteger('user_id');
        $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onUpdate('CASCADE')
            ->onDelete('CASCADE');
        $table->timestamps();
    });
}

migration 寫好之後即可下指令建立 Table
php artisan migrate

這時候就要開始解釋三者之間的關係

一個使用者可以發佈多篇評論,所以使用者與評論的關係屬於一對多,此時到 User 的 Model 設定關聯

public function posts()
{
    return $this->hasMany(Post::class, 'writer_id');
}

一篇評論會有多個留言,所以評論與留言的關係是一對多,但是一篇評論只會有一個最佳留言,所以最佳留言與評論的關係是一對一

public function comments()
{
    return $this->hasMany(Comment::class, 'post_id');
}
public function bestComment()
{
    return $this->hasOne(Comment::class);
}

今天先介紹這幾個常用關聯就好,明天再來繼續介紹其他在 Model 裡好用的參數。


上一篇
DAY06 - 資料庫這檔事
下一篇
DAY08 - 創造的工具
系列文
持續進化論30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言